package com.edu.exam.entity.exampaper.generation;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 质量评估实体类
 *
 * <p>质量评估表用于存储组卷结果的质量评估数据，记录完整性、分布性、难度、知识点等多维度评分。
 * 支持试卷质量的全面评估和问题发现，为组卷算法优化提供数据支持。</p>
 *
 * <p>核心功能：
 * - 多维度质量评估：从完整性、分布性、难度、知识点等多个维度评估试卷质量
 * - 评分体系：提供科学的评分算法和权重设置
 * - 问题发现：自动识别试卷中存在的质量问题
 * - 改进建议：基于评估结果提供具体的改进建议</p>
 *
 * <p>评估维度：
 * - completeness_score：完整性分数 - 试题数量、分值是否完整
 * - distribution_score：分布性分数 - 题型、难度分布是否合理
 * - difficulty_score：难度分数 - 难度控制是否准确
 * - knowledge_score：知识点分数 - 知识点覆盖是否充分</p>
 *
 * @author 系统生成
 * @version 2.0
 * @since 2025-11-09
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Entity
@EntityListeners(AuditingEntityListener.class)
public class GenerationQualityAssessment {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 评估ID
     *
     * <p>质量评估的唯一标识符，采用UUID格式生成。
     * 用于评估的唯一标识和结果追踪。</p>
     */
    @Column(name = "assessment_id", nullable = false, length = 32, unique = true)
    private String assessmentId;

    /**
     * 任务ID
     *
     * <p>关联组卷任务的ID，用于标识评估对应的组卷任务。
     * 必须在组卷任务表中存在有效的任务记录。</p>
     */
    @Column(name = "task_id", nullable = false, length = 32)
    private String taskId;

    /**
     * 试卷ID
     *
     * <p>被评估试卷的ID，用于关联具体的试卷记录。
     * 可选字段，当试卷生成成功时填充。</p>
     */
    @Column(name = "paper_id", length = 32)
    private String paperId;

    /**
     * 总体分数
     *
     * <p>试卷的总体质量评分，取值范围0-100。
     * 基于各维度分数的加权平均计算得出。</p>
     */
    @Column(name = "overall_score", precision = 5, scale = 2)
    private Double overallScore;

    /**
     * 完整性分数
     *
     * <p>试卷完整性评分，取值范围0-100。
     * 评估试题数量、分值分配是否符合预期要求。</p>
     */
    @Column(name = "completeness_score", precision = 5, scale = 2)
    private Double completenessScore;

    /**
     * 分布性分数
     *
     * <p>试题分布合理性评分，取值范围0-100。
     * 评估题型分布、难度分布、知识点分布是否合理。</p>
     */
    @Column(name = "distribution_score", precision = 5, scale = 2)
    private Double distributionScore;

    /**
     * 难度分数
     *
     * <p>难度控制评分，取值范围0-100。
     * 评估试卷整体难度是否符合预期要求。</p>
     */
    @Column(name = "difficulty_score", precision = 5, scale = 2)
    private Double difficultyScore;

    /**
     * 知识点分数
     *
     * <p>知识点覆盖评分，取值范围0-100。
     * 评估知识点覆盖范围和分布是否充分合理。</p>
     */
    @Column(name = "knowledge_score", precision = 5, scale = 2)
    private Double knowledgeScore;

    /**
     * 评估详情
     *
     * <p>JSON格式的详细评估信息，包含各维度的详细评分依据、计算过程等。
     * 提供评估过程的透明度和可追溯性。</p>
     */
    @Column(name = "assessment_details", columnDefinition = "CLOB")
    private String assessmentDetails;

    /**
     * 发现问题
     *
     * <p>JSON格式的问题列表，记录评估过程中发现的质量问题。
     * 包含问题描述、严重程度、影响范围等信息。</p>
     */
    @Column(name = "issues_found", columnDefinition = "CLOB")
    private String issuesFound;

    /**
     * 改进建议
     *
     * <p>JSON格式的改进建议列表，基于评估结果提供具体的改进建议。
     * 包含建议类型、具体措施、预期效果等信息。</p>
     */
    @Column(name = "suggestions", columnDefinition = "CLOB")
    private String suggestions;

    /**
     * 评估者类型
     *
     * <p>评估的类型标识，用于区分不同类型的评估。
     * 支持的类型包括：AUTO（自动评估）、MANUAL（人工评估）、HYBRID（混合评估）。</p>
     */
    @Column(name = "assessor_type", nullable = false, length = 20)
    private String assessorType = "AUTO";

    /**
     * 评估时间
     *
     * <p>质量评估的执行时间，记录评估的具体时间点。
     * 用于评估过程的时间跟踪和分析。</p>
     */
    @Column(name = "assess_time", nullable = false)
    private LocalDateTime assessTime;

    // ===== 标准审计字段 =====

    /**
     * 创建时间
     */
    @CreationTimestamp
    @Column(name = "created_time", nullable = false, updatable = false)
    private LocalDateTime createdTime;

    /**
     * 更新时间
     */
    @UpdateTimestamp
    @Column(name = "updated_time", nullable = false)
    private LocalDateTime updatedTime;

    /**
     * 版本号（乐观锁）
     */
    @Version
    @Column(name = "version", nullable = false)
    private Long version = 0L;

    /**
     * 是否删除
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;

}